﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using produccion.clases;
using System.Windows.Input;
using System.Windows;
using System.Collections.ObjectModel;
using System.ComponentModel;
using produccion.modelo;
using produccion.AccesoDatos;
using System.Diagnostics;
using System.Collections.Specialized;
using System.Windows.Controls;
using System.Globalization;
using System.Windows.Media.Imaging;
using System.Data;
using produccion.reportes;

namespace produccion.vistamodelo
{
    public class VMInformeLineaProduccion : ViewModelBase
    {
        #region Campos
            //FJRF - Creamos la variables de validacion de cliente y de linea
            string strLineaInicial, strLineaFinal, strClienteInicial, strClienteFinal, strLineaABuscar;

            private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();//Guarda los metodos que tienen los SP
            private CLSMAECLIP _Clientes = new CLSMAECLIP();
        #endregion
        #region Constructor
            public VMInformeLineaProduccion()
            {
                try
                {
                    if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                    {
                        MDOgeneral.conectar();
                    }
                    strTituloVentana = "INFORME LÍNEAS DE PRODUCICÓN" + " - Usuario: " + MDOgeneral.usuario + " - [FrmInformeLineaProduccion]";

                    consClientes();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
        #endregion
        #region Interfaces publicas (Propiedades)
            //CODIGO TITULO DEL FORMULARIO
            private string _strSeccion;
            public string strSeccion
            {
                get { return _strSeccion; }
                set 
                {
                    _strSeccion = value;
                    PrivV_CargarLineas(_strSeccion);
                    Consultar();
                    base.OnPropertyChanged("strSeccion"); 
                }
            }
            private string _strLineaCodigo;
            public string strLineaCodigo
            {
                get { return _strLineaCodigo; }
                set
                {
                    _strLineaCodigo = value;
                    base.OnPropertyChanged("strLineaCodigo");
                }
            }
            private string _strClienteCodigo;
            public string strClienteCodigo
            {
                get { return _strClienteCodigo; }
                set
                {
                    _strClienteCodigo = value;
                    base.OnPropertyChanged("strClienteCodigo");
                }
            }
            private string _strSeparaClientes = "N";
            public string strSeparaClientes
            {
                get { return _strSeparaClientes; }
                set
                {
                    _strSeparaClientes = value;
                    Consultar();
                    base.OnPropertyChanged("strSeparaClientes");
                }
            }
            private string _strSeparaPedidos = "N";
            public string strSeparaPedidos
            {
                get { return _strSeparaPedidos; }
                set
                {
                    _strSeparaPedidos = value;
                    Consultar();
                    base.OnPropertyChanged("strSeparaPedidos");
                }
            }
            private string _strSeparaReferencias = "N";
            public string strSeparaReferencias
            {
                get { return _strSeparaReferencias; }
                set
                {
                    _strSeparaReferencias = value;
                    Consultar();
                    base.OnPropertyChanged("strSeparaReferencias");
                }
            }
            private string _strTipo;
            public string strTipo
            {
                get { return _strTipo; }
                set
                {
                    _strTipo = value;
                    Consultar();
                    base.OnPropertyChanged("strTipo");
                }
            }
            private List<clases.CLSMAECLIP> _lisClie = new List<clases.CLSMAECLIP>();
            public List<clases.CLSMAECLIP> lisClie
            {
                get { return _lisClie; }
                set { _lisClie = value; base.OnPropertyChanged("lisClie"); }
            }
            private clases.CLSMAECLIP _selcli = new clases.CLSMAECLIP();
            public clases.CLSMAECLIP selcli
            {
                get { return _selcli; }
                set 
                {
                    _selcli = value;
                    if (_selcli == null)
                    {
                        strClienteCodigo = "";
                    }
                    else
                    {
                        strClienteCodigo = _selcli.CODCLI_CLI;
                    }
                    Consultar();
                    base.OnPropertyChanged("selcli"); 
                }
            }
            private List<clases.CLSCONTROLP> _lisLineas = new List<clases.CLSCONTROLP>();
            public List<clases.CLSCONTROLP> lisLineas
            {
                get { return _lisLineas; }
                set { _lisLineas = value; base.OnPropertyChanged("lisLineas"); }
            }
            private clases.CLSCONTROLP _selLineas = new clases.CLSCONTROLP();
            public clases.CLSCONTROLP selLineas
            {
                get { return _selLineas; }
                set
                {
                    _selLineas = value;
                    if (_selLineas == null)
                    {
                        strLineaCodigo = "";
                    }
                    else
                    {
                        strLineaCodigo = _selLineas.COD_CON;
                    }
                    Consultar();
                    base.OnPropertyChanged("selLineas");
                }
            }
            //FJRF - TITULO VENTANA
            private string _strTituloVentada;
            public string strTituloVentana
            {
                get { return _strTituloVentada; }
                set
                {
                    _strTituloVentada = value; base.OnPropertyChanged("strTituloVentana");
                }
            }
            private List<MInformeLineaProduccion> _LisInformeLineaProduccion;
            public List<MInformeLineaProduccion> LisInformeLineaProduccion
            {
                get { return _LisInformeLineaProduccion; }
                set { _LisInformeLineaProduccion = value; base.OnPropertyChanged("LisInformeLineaProduccion"); }
            }
            private VmInformeLineaProduccion _selLisInformeLineaProduccion = new VmInformeLineaProduccion();
            public VmInformeLineaProduccion selLisInformeLineaProduccion
            {
                get { return _selLisInformeLineaProduccion; }
                set 
                {
                    _selLisInformeLineaProduccion = value;
                    if (_selLisInformeLineaProduccion != null)
                    {
                        base.OnPropertyChanged("selLisInformeLineaProduccion");
                    }
                }
            }
            private ObservableCollection<VmInformeLineaProduccion> _lisInformeLineaProduccion = new ObservableCollection<VmInformeLineaProduccion>();
            public ObservableCollection<VmInformeLineaProduccion> lisInformeLineaProduccion
            {
                get { return _lisInformeLineaProduccion; }
                set { _lisInformeLineaProduccion = value; base.OnPropertyChanged("lisInformeLineaProduccion"); }
            }
        #endregion
        #region Comandos
            RelayCommand _cmdSalir;
            public ICommand cmdSalir
            {
                get
                {
                    if (_cmdSalir == null)
                    {
                        _cmdSalir = new RelayCommand(Salir);
                    }
                    return _cmdSalir;
                }
            }

            //FJRF - Final de Consulta de periodos
            RelayCommand _cmdImprimir;
            public ICommand cmdImprimir
            {
                get
                {
                    if (_cmdImprimir == null)
                    {
                        _cmdImprimir = new RelayCommand(x => imprimir());
                    }
                    return _cmdImprimir;
                }
            }
        #endregion
        #region Metodos
            private void PrivV_CargarLineas(string strSeccionSeleccionada)
            {
                if (strSeccionSeleccionada == "P")
                {
                    strLineaABuscar = "LPR";
                }
                if (strSeccionSeleccionada == "C")
                {
                    strLineaABuscar = "LCO";
                }
                if (strSeccionSeleccionada == "G")
                {
                    strLineaABuscar = "LGU";
                }
                if (strSeccionSeleccionada == "M")
                {
                    strLineaABuscar = "LMO";
                }

                lisLineas = new clases.CLSCONTROLP().LisControles();

                int numContador = 0;
                List<CLSCONTROLP> all = (from lis in lisLineas where lis.ID_CON.Trim() == strLineaABuscar.Trim() orderby lis.NOM_CON select lis ).ToList();
                foreach (CLSCONTROLP lin in all)
                {
                    numContador++;
                }
                lisLineas = new List<CLSCONTROLP>(all);
                base.OnPropertyChanged("lisLineas");
            }
            public void consClientes()
            {
                try
                {
                    lisClie = new clases.CLSMAECLIP().listaCliente();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            private void Consultar()
            {
                if (PrivB_ValidarDatosConsultaYEjecutarSp() == true)
                {
                    LisInformeLineaProduccion = _repositorio.consultarInformeLineaProduccion(strSeccion, strLineaInicial, strLineaFinal, strSeparaClientes, strSeparaPedidos, strSeparaReferencias, strClienteInicial, strClienteFinal, strTipo);

                    int numContador = 0;

                    List<VmInformeLineaProduccion> all = (from lis in LisInformeLineaProduccion select new VmInformeLineaProduccion(lis)).ToList();
                    foreach (VmInformeLineaProduccion VmDatos in all)
                    {
                        numContador++;
                    }
                    lisInformeLineaProduccion = new ObservableCollection<VmInformeLineaProduccion>(all);
                }
            }
            private Boolean PrivB_ValidarDatosConsultaYEjecutarSp()
            {
                Boolean BooDatosCorrectos = true;
                //FJRF - SE VALIDA: SECCION
                if (strSeccion == null || strSeccion.Trim() == "")
                {
                    BooDatosCorrectos = false;
                }
                //FJRF - SE VALIDA: LINEA
                if (strLineaCodigo == null || strLineaCodigo.Trim() == "")//FJRF - Si la linea esta nula o vacia hacemos lo siguiente
                {
                    strLineaInicial = "   ";//FJRF - Asignamos valores por defecto
                    strLineaFinal = "ZZZ";//FJRF - Asignamos valores por defecto
                }
                else//FJRF - Si los datos vienen correctamente hacemos lo siguiente
                {
                    strLineaInicial = strLineaCodigo;//FJRF - Asignamos el parametro enviado
                    strLineaFinal = strLineaCodigo;//FJRF - Asignamos el parametro enviado
                }
                //FJRF - SE VALIDA: SEPARA
                if (strSeparaClientes == null || strSeparaClientes.Trim() == "")
                {
                    BooDatosCorrectos = false;
                }
                if (strSeparaPedidos == null || strSeparaPedidos.Trim() == "")
                {
                    BooDatosCorrectos = false;
                }
                if (strSeparaReferencias == null || strSeparaReferencias.Trim() == "")
                {
                    BooDatosCorrectos = false;
                }
                //FJRF - SE VALIDA: CLIENTE
                if (strClienteCodigo == null || strClienteCodigo.Trim() == "")//FJRF - Si el cliente esta nulo o vacio hacemos lo siguiente
                {
                    strClienteInicial = "   ";//FJRF - Asignamos valores por defecto
                    strClienteFinal = "ZZZ";//FJRF - Asignamos valores por defecto
                }
                else//FJRF - Si los datos vienen correctamente hacemos lo siguiente
                {
                    strClienteInicial = strClienteCodigo;//FJRF - Asignamos el parametro enviado
                    strClienteFinal = strClienteCodigo;//FJRF - Asignamos el parametro enviado
                }
                //FJRF - SE VALIDA: TIPO
                if (strTipo == null || strTipo.Trim() == "")
                {
                    BooDatosCorrectos = false;
                }

                return BooDatosCorrectos;
            }
            public void Salir(Object frmformulario)
            {
                ((Window)frmformulario).Close();
            }
            private void ConsultarDatos(String StrTipoDeConsulta)
            {
                int IntCantidadDeRegistros = 0;
                List<VmInformeLineaProduccion> all = (from lis in LisInformeLineaProduccion select new VmInformeLineaProduccion(lis)).ToList();
                foreach (VmInformeLineaProduccion xx in all)
                {
                    IntCantidadDeRegistros++;
                }

                lisInformeLineaProduccion = new ObservableCollection<VmInformeLineaProduccion>(all);
            }
             private string ValidarDato(string StrCampo, string StrDato)
             {
                 if (StrCampo == "No existe")
                 {
                     //StrDato = ""; //Se quita para que pase los parametros como se envian directamente si se va a enviar al informe vacio solo quitar comentario
                 }
                 return StrDato;
             }
             private void imprimir()
             {
                 try
                 {
                    //FJRF - En esta parte creamos los campos de los parametros que seran enviados
                    DataTable dtParametros = new DataTable("DtbParametros");
                    dtParametros.Columns.Add("pva_seccion", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_linini", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_linfin", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_sepcli", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_sepped", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_sepref", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_cliini", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_clifin", System.Type.GetType("System.String"));
                    dtParametros.Columns.Add("pva_tipo", System.Type.GetType("System.String"));

                    //FJRF  - En esta parte de envian los parametros
                    DataRow drParametros;
                    drParametros = dtParametros.NewRow();
                    drParametros["pva_seccion"] = strSeccion;
                    drParametros["pva_linini"] = strLineaInicial;
                    drParametros["pva_linfin"] = strLineaFinal;
                    drParametros["pva_sepcli"] = strSeparaClientes;
                     drParametros["pva_sepped"] = strSeparaPedidos;
                    drParametros["pva_sepref"] = strSeparaReferencias;
                    drParametros["pva_cliini"] = strClienteInicial;
                    drParametros["pva_clifin"] = strClienteFinal;
                    drParametros["pva_tipo"] = strTipo;

                    dtParametros.Rows.Add(drParametros);

                    DataTable dtImp = new DataTable("DtbInformeLineaProduccion");
                    dtImp.Columns.Add("CODLIN_TMP");
                    dtImp.Columns.Add("NOMLIN_TMP");
                    dtImp.Columns.Add("NOMCLI_TMP");
                    dtImp.Columns.Add("NROPED_TMP");
                    dtImp.Columns.Add("NROORI_TMP");
                    dtImp.Columns.Add("FECPED_TMP");
                    dtImp.Columns.Add("FECVTO_TMP");
                    dtImp.Columns.Add("NOMREF_TMP");
                    dtImp.Columns.Add("NOMCOL_TMP");
                    dtImp.Columns.Add("CANPED_TMP");
                    dtImp.Columns.Add("CANPEN_TMP");
                    dtImp.Columns.Add("VALOR_TMP");

                    DataRow dr;
                    foreach (VmInformeLineaProduccion i in lisInformeLineaProduccion)
                    {
                        dr = dtImp.NewRow();
                        dr["CODLIN_TMP"] = i.CODLIN_TMP;
                        dr["NOMLIN_TMP"] = i.NOMLIN_TMP;
                        dr["NOMCLI_TMP"] = i.NOMCLI_TMP;
                        dr["NROPED_TMP"] = i.NROPED_TMP;
                        dr["NROORI_TMP"] = i.NROORI_TMP;
                        dr["FECPED_TMP"] = i.FECPED_TMP;
                        dr["FECVTO_TMP"] = i.FECVTO_TMP;
                        dr["NOMREF_TMP"] = i.NOMREF_TMP;
                        dr["NOMCOL_TMP"] = i.NOMCOL_TMP;
                        dr["CANPED_TMP"] = i.CANPED_TMP;
                        dr["CANPEN_TMP"] = i.CANPEN_TMP;
                        dr["VALOR_TMP"] = i.VALOR_TMP;

                        dtImp.Rows.Add(dr);
                    }

                    DataSet ds = new DataSet("DsInformeLineaProduccion");

                    
                    ds.Tables.Add(dtImp);//Tabla
                    ds.Tables.Add(dtParametros);//Parametros

                    Vista vista = new Vista { ds = ds, reporte = @"reportes\rptInformeLineaProduccion.rpt" };
                    vista.Show();
                 }
                 catch (Exception ex) { MessageBox.Show(ex.Message); }
             }
        #endregion
    }

    public class VmInformeLineaProduccion : ViewModelBase
    {
        #region Campos
        private MInformeLineaProduccion _InformeLineaProduccion = new MInformeLineaProduccion();
        private VmInformeLineaProduccion lis;
        #endregion

        #region Constructor
            public VmInformeLineaProduccion(MInformeLineaProduccion InformeLineaProduccion)
            {
                _InformeLineaProduccion = InformeLineaProduccion;
            }
            public VmInformeLineaProduccion()
            { 
            
            }

            public VmInformeLineaProduccion(VmInformeLineaProduccion lis)
            {
                // TODO: Complete member initialization
                this.lis = lis;
            }
        #endregion

        #region interfaces publicas (Propiedades)
            //FJRF - 01. Codigo linea
            public string CODLIN_TMP
            {
                get { return _InformeLineaProduccion.CODLIN_TMP; }
                set { _InformeLineaProduccion.CODLIN_TMP = value; base.OnPropertyChanged("CODLIN_TMP"); }
            }
            //FJRF - 02. Nombre linea
            public string NOMLIN_TMP
            {
                get { return _InformeLineaProduccion.NOMLIN_TMP; }
                set { _InformeLineaProduccion.NOMLIN_TMP = value; base.OnPropertyChanged("CODLIN_TMP"); }
            }
            //FJRF - 03. Codigo cliente
            public string CODCLI_TMP
            {
                get { return _InformeLineaProduccion.CODCLI_TMP; }
                set { _InformeLineaProduccion.CODCLI_TMP = value; base.OnPropertyChanged("CODCLI_TMP"); }
            }
            //FJRF - 04. Nombre cliente
            public string NOMCLI_TMP
            {
                get { return _InformeLineaProduccion.NOMCLI_TMP; }
                set { _InformeLineaProduccion.NOMCLI_TMP = value; base.OnPropertyChanged("NOMCLI_TMP"); }
            }
            //FJRF - 05. Numero pedido
            public Int32 NROPED_TMP
            {
                get { return _InformeLineaProduccion.NROPED_TMP; }
                set { _InformeLineaProduccion.NROPED_TMP = value; base.OnPropertyChanged("NROPED_TMP"); }
            }
            //FJRF - 06. Numero original
            public string NROORI_TMP
            {
                get { return _InformeLineaProduccion.NROORI_TMP; }
                set { _InformeLineaProduccion.NROORI_TMP = value; base.OnPropertyChanged("NROORI_TMP"); }
            }
            //FJRF - 07. Fecha pedido
            public DateTime FECPED_TMP
            {
                get { return _InformeLineaProduccion.FECPED_TMP; }
                set { _InformeLineaProduccion.FECPED_TMP = value; base.OnPropertyChanged("FECPED_TMP"); }
            }
            //FJRF - 08. Fecha vencimiento
            public DateTime FECVTO_TMP
            {
                get { return _InformeLineaProduccion.FECVTO_TMP; }
                set { _InformeLineaProduccion.FECVTO_TMP = value; base.OnPropertyChanged("FECVTO_TMP"); }
            }
            //FJRF - 09. Cantidad pedida
            public Int32 CANPED_TMP
            {
                get { return _InformeLineaProduccion.CANPED_TMP; }
                set { _InformeLineaProduccion.CANPED_TMP = value; base.OnPropertyChanged("CANPED_TMP"); }
            }
            //FJRF - 10. Cantidad pendiente
            public Int32 CANPEN_TMP
            {
                get { return _InformeLineaProduccion.CANPEN_TMP; }
                set { _InformeLineaProduccion.CANPEN_TMP = value; base.OnPropertyChanged("CANPEN_TMP"); }
            }
            //FJRF - 11. Valor
            public Double VALOR_TMP
            {
                get { return _InformeLineaProduccion.VALOR_TMP; }
                set { _InformeLineaProduccion.VALOR_TMP = value; base.OnPropertyChanged("VALOR_TMP"); }
            }
            //FJRF - 12. Codigo referencia
            public string CODREF_TMP
            {
                get { return _InformeLineaProduccion.CODREF_TMP; }
                set { _InformeLineaProduccion.CODREF_TMP = value; base.OnPropertyChanged("CODREF_TMP"); }
            }
            //FJRF - 13. Codigo color
            public string CODCOL_TMP
            {
                get { return _InformeLineaProduccion.CODCOL_TMP; }
                set { _InformeLineaProduccion.CODCOL_TMP = value; base.OnPropertyChanged("CODCOL_TMP"); }
            }
            //FJRF - 14. Nombre referencia
            public string NOMREF_TMP
            {
                get { return _InformeLineaProduccion.NOMREF_TMP; }
                set { _InformeLineaProduccion.NOMREF_TMP = value; base.OnPropertyChanged("NOMREF_TMP"); }
            }
            //FJRF - 15. Nombre color
            public string NOMCOL_TMP
            {
                get { return _InformeLineaProduccion.NOMCOL_TMP; }
                set { _InformeLineaProduccion.NOMCOL_TMP = value; base.OnPropertyChanged("NOMCOL_TMP"); }
            }
        #endregion

        #region Metodos
            public MInformeLineaProduccion getInformeLineaProduccion()
            {
                return _InformeLineaProduccion;
            }
        #endregion
    }

}
